package com.example.docmanagement.repository;

import com.example.docmanagement.entity.Document;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 文档数据访问层
 */
@Repository
public interface DocumentRepository extends JpaRepository<Document, Long> {

        /**
         * 根据 slug 查找文档
         */
        Optional<Document> findBySlug(String slug);

        /**
         * 根据 slug 查找文档（包含分类信息，避免 N+1 查询）
         */
        @Query("SELECT d FROM Document d " +
                        "LEFT JOIN FETCH d.category " +
                        "WHERE d.slug = :slug")
        Optional<Document> findBySlugWithCategory(@Param("slug") String slug);

        /**
         * 检查 slug 是否存在
         */
        boolean existsBySlug(String slug);

        /**
         * 根据状态查询文档（分页）
         */
        Page<Document> findByStatus(String status, Pageable pageable);

        /**
         * 根据状态查询文档（包含分类信息，避免 N+1 查询）
         * 注意：使用 JOIN FETCH 时，分页需要在 Service 层手动处理
         */
        @Query("SELECT d FROM Document d " +
                        "LEFT JOIN FETCH d.category " +
                        "WHERE d.status = :status " +
                        "ORDER BY d.updatedAt DESC")
        List<Document> findByStatusWithCategory(@Param("status") String status);

        /**
         * 根据分类查询文档（分页）
         */
        Page<Document> findByCategoryId(Long categoryId, Pageable pageable);

        /**
         * 根据分类和状态查询文档（分页）
         */
        @Query("SELECT d FROM Document d WHERE d.category.id = :categoryId AND d.status = :status")
        Page<Document> findByCategoryIdAndStatus(
                        @Param("categoryId") Long categoryId,
                        @Param("status") String status,
                        Pageable pageable);

        /**
         * 复杂搜索查询（支持关键词、分类、状态筛选）
         * 注意：只搜索 title 和 summary，不搜索 content（避免 bytea 类型问题）
         */
        @Query("SELECT d FROM Document d WHERE " +
                        "(:keyword IS NULL OR :keyword = '' OR " +
                        "  LOWER(d.title) LIKE LOWER(CONCAT('%', :keyword, '%')) OR " +
                        "  (d.summary IS NOT NULL AND LOWER(d.summary) LIKE LOWER(CONCAT('%', :keyword, '%')))) " +
                        "AND (:categoryId IS NULL OR d.category.id = :categoryId) " +
                        "AND (:status IS NULL OR d.status = :status)")
        Page<Document> searchDocuments(
                        @Param("keyword") String keyword,
                        @Param("categoryId") Long categoryId,
                        @Param("status") String status,
                        Pageable pageable);

        /**
         * 复杂搜索查询（包含分类信息，避免 N+1 查询）
         * 注意：使用 JOIN FETCH 时，分页需要在 Service 层手动处理
         */
        @Query("SELECT DISTINCT d FROM Document d " +
                        "LEFT JOIN FETCH d.category " +
                        "WHERE (:keyword IS NULL OR :keyword = '' OR " +
                        "  LOWER(d.title) LIKE LOWER(CONCAT('%', :keyword, '%')) OR " +
                        "  (d.summary IS NOT NULL AND LOWER(d.summary) LIKE LOWER(CONCAT('%', :keyword, '%')))) " +
                        "AND (:categoryId IS NULL OR d.category.id = :categoryId) " +
                        "AND (:status IS NULL OR d.status = :status) " +
                        "ORDER BY d.updatedAt DESC")
        List<Document> searchDocumentsWithCategory(
                        @Param("keyword") String keyword,
                        @Param("categoryId") Long categoryId,
                        @Param("status") String status);

        /**
         * 统计分类下的文档数量
         */
        long countByCategoryId(Long categoryId);
}
